/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Clases.Gasto;
import java.sql.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * Esta clase es la persistencia a la base de datos para la gestión de gastos. En esta clase se podrá:
 *    - Añadir un gasto
 *    - Obtener un gasto
 *    - Obtener todos los gastos
 * @author Jesús Fernández
 */
public class PersistenciaGasto {


    public static int insertarGasto(Gasto gasto){
        
        int ret = 0;

        // datos para hacer la inserción del gasto recibido
        float importe = gasto.getImporte();
        Date fecha = gasto.getFecha();
        String concepto = gasto.getConcepto();
        String archivo = gasto.getArchivo();
        String observacion = gasto.getObservacion();

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); // para hacer la conversion de la fecha en el formato de BD

        // sentencia SQL para la insercion en BD
        String sql = "insert into gasto (importe, fecha, concepto, archivo, observacion)"
                   + " values ("+ importe +", '"+ df.format(fecha) +"','"+ concepto
                   + "', '"+ archivo +"', '"+ observacion+"');";

        // declaracion de variables para la conexion de la BD
        Connection con  = null;
        Statement st = null;

        // CONEXION y ejecucion de la sentencia SQL
        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            ret = st.executeUpdate(sql);
        }
        catch(Exception e){
            System.out.println("Error al insertar un nuevo GASTO \n\n"+e.getMessage());
        }
        finally{
            Conexion.cerrarConexion(con);
        }

        return ret;
    }


    public static Gasto obtenterGasto(String codigo){

        // sentencia SQL
        String sql= "select * from gasto where codigo = '"+ codigo +"';";

        // declaracion de variables para la conexion y ejecucion de la SQL en BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        // declaracion de variables para el objeto gasto
        Gasto gasto = null;
        float importe = 0f;
        Date fecha = null;
        String concepto = null;
        String archivo = null;
        String observacion = null;


        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if(rs.next()){

                importe = rs.getFloat("importe");
                fecha = rs.getDate("fecha");
                concepto = rs.getString("concepto");
                archivo = rs.getString("archivo");
                observacion = rs.getString("observacion");

                gasto = new Gasto(codigo, importe, fecha, concepto, archivo, observacion);

            }

            rs.close();
            st.close();

        }
        catch(Exception e){
            System.out.println("Error al obtener el GASTO \n "+e.getMessage());
        }
        finally{
            Conexion.cerrarConexion(con);
        }
        return gasto;
    }

    public static int totalGastosUltimoMes(){
        int ret = 0;
        
        
        Calendar fechActual = new GregorianCalendar();
        fechActual.setTime(new Date());
        int anio = fechActual.get(Calendar.YEAR);
        int mes = fechActual.get(Calendar.MONTH)+1;
        
        String sql = "select count(*) total from gasto where fecha between '"+ Integer.toString(anio) +"-"+ Integer.toString(mes) +"-01' "
                      + "and '"+ Integer.toString(anio) +"-"+ Integer.toString(mes) +"-31' ";

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if(rs.next()){

                ret = rs.getInt("total");
            }
            
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener todos los GASTOS \n "+e.getMessage());
        }
        
        
        return ret;
    }

    public static int totalGastosFechas(Date fechaI, Date fechaF){
        int ret = 0;
        
        // sentencia SQL
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String sql = "select count(*) total from gasto where fecha between '"+ df.format(fechaI) +"' and '"+ df.format(fechaF) +"'";

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if(rs.next()){

               ret = rs.getInt("total");
            }
            
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener todos los GASTOS \n "+e.getMessage());
        }        
        
        return ret;
    }
    
    public static ArrayList<Gasto> obtenerGastosUltimoMesPaginacion(int limit, int offset){

        // sentencia SQL
        Calendar fechActual = new GregorianCalendar();
        fechActual.setTime(new Date());
        int anio = fechActual.get(Calendar.YEAR);
        int mes = fechActual.get(Calendar.MONTH)+1;
        
        String sql = "select * from gasto where fecha between '"+ Integer.toString(anio) +"-"+ Integer.toString(mes) +"-01' "
                      + "and '"+ Integer.toString(anio) +"-"+ Integer.toString(mes) +"-31' "
                      + " order by fecha desc limit "+ limit +" offset "+ offset +" ;";

        // declaracion de variables para el objeto gasto
        ArrayList<Gasto> listagastos = new ArrayList();
        Gasto gasto = null;
        String codigo = null;
        float importe = 0f;
        Date fecha = null;
        String concepto = null;
        String archivo = null;
        String observacion = null;

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while(rs.next()){

                codigo = rs.getString("codigo");
                importe = rs.getFloat("importe");
                fecha = rs.getDate("fecha");
                concepto = rs.getString("concepto");
                archivo = rs.getString("archivo");
                observacion = rs.getString("observacion");

                gasto = new Gasto(codigo, importe, fecha, concepto, archivo, observacion);

                listagastos.add(gasto);
            }
            
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener todos los GASTOS \n "+e.getMessage());
        }
        return listagastos;
    }
    
     public static ArrayList<Gasto> obtenerGastosFechasPaginacion(Date fechaI, Date fechaF, int limit, int offset){

        // sentencia SQL
         DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String sql = "select * from gasto where fecha between '"+ df.format(fechaI) +"' and '"+ df.format(fechaF) +"'"
                + " order by fecha desc limit "+ limit +" offset "+ offset +" ;";

        // declaracion de variables para el objeto gasto
        ArrayList<Gasto> listagastos = new ArrayList();
        Gasto gasto = null;
        String codigo = null;
        float importe = 0f;
        Date fecha = null;
        String concepto = null;
        String archivo = null;
        String observacion = null;

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try{
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while(rs.next()){

                codigo = rs.getString("codigo");
                importe = rs.getFloat("importe");
                fecha = rs.getDate("fecha");
                concepto = rs.getString("concepto");
                archivo = rs.getString("archivo");
                observacion = rs.getString("observacion");

                gasto = new Gasto(codigo, importe, fecha, concepto, archivo, observacion);

                listagastos.add(gasto);
            }
            
            rs.close();
            st.close();
        }
        catch(Exception e){
            System.out.println("Error al obtener todos los GASTOS \n "+e.getMessage());
        }
        return listagastos;
    }

     public static int actualizaGasto(Gasto gasto){
         int ret = 0;

         Connection con = null;
        Statement st = null;

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");


        String sql = "update gasto set "
                + "importe =  " + gasto.getImporte() + ", "
                + "fecha =  '" + df.format(gasto.getFecha()) + "', "
                + "concepto = '" + gasto.getConcepto() + "', "
                + "archivo = '" + gasto.getArchivo() + "', "
                + "observacion = '" + gasto.getObservacion() + "' "
                + "where codigo = " + gasto.getCodigo() + ";";

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            ret = st.executeUpdate(sql);
        } catch (Exception e) {
            System.out.println("Error al modificar gasto" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }

         return ret;
     }
     
     public static int eliminarGasto(String codigo) {

         int insertado = 0;
        //int cod= Integer.parseInt(codigo);
         
        Connection con = null;
        Statement st = null;
        //ResultSet rs = null;

        String sql = "delete from gasto where codigo = '" + codigo + "';";

        try {
            con = (Connection) Conexion.getConexion();
            st = (Statement) con.createStatement();
            insertado = st.executeUpdate(sql);

        } catch (Exception e) {
            System.out.println("Error al eliminar gasto \n " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return insertado;
    }

}
